1、第一次出现一次的字符
做法：利用map，统计每个字符出现的次数，然后按照下标对应的字符，遍历map；
class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        if(str.empty())
            return -1;
        unordered_map<char,int> m;
        for(auto e:str)
            m[e]++;
        int ans=-1;
        for(int i=0;i<str.size();i++)
        {
            if(m[str[i]]==1)
            {
                ans=i;
                break;
            }
        }
        return ans;
    }
};
2、数组的逆序对
做发：归并排序
class Solution {
public:
    int _InversePairs(vector<int>& data,vector<int>& v,int begin,int end)
    {
        if(begin>=end)
            return 0;
        int mid=(begin+end)/2;
        long long count=_InversePairs(data,v,begin,mid)+_InversePairs(data,v,mid+1,end);
        for(int i=begin;i<=end;i++)
        {
            v[i]=data[i];
        }
        int i=begin,j=mid+1;
        for(int k=begin;k<=end;k++)
        {
            if(i==mid+1)
            {
                data[k]=v[j++];
            }
            else if(j==end+1||v[i]<=v[j])
            {
                data[k]=v[i++];
            }
            else
            {
                data[k]=v[j++];
                
                count+=mid-i+1;
            }
        }
        return (int)(count%1000000007);
    }
    int InversePairs(vector<int> data) {
        if(data.empty())
            return 0;
        vector<int> v(data.size(),0);
        return _InversePairs(data,v,0,data.size()-1);
        
    }
};
3、和为s的两个数
做法：也就是双指针法；
class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<int> v;
        if(array.empty())
            return v;
        int left=0;
        int right=array.size()-1;
        int ans=INT_MAX;
        while(left<right)
        {
            if((array[left]+array[right])>sum)
                right--;
            else if((array[left]+array[right])<sum)
                left++;
            else
            {
                int x=array[left]*array[right];
                if(ans>x)
                {
                    ans=x;
                    v.push_back(array[left]);
                    v.push_back(array[right]);
                }
                left++;
            }
        }
        return v;
    }
};

4、和为s的所有序列
思想：定义2个指针，2指针之间元素相加，比较，利用等比求和公式求；
class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int>> vv;
        vector<int> v;
        if(sum==0)
            return vv;
        for(int i=1,j=2;i<j;)
        {
            int ans=(i+j)*(j-i+1)/2;
            if(ans==sum)
            {
                v.clear();
                for(int x=i;x<=j;x++)
                    v.push_back(x);
                vv.push_back(v);
                j++;
            }
            else if(ans>sum)
                i++;
            else
                j++;
        }
        return vv;
    }
};
